package com.wdb.utils;

import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.poi.excel.BigExcelWriter;
import cn.hutool.poi.excel.ExcelUtil;
import com.alibaba.excel.EasyExcel;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Map;

/**
 * @author: wendaobai@qq.com
 * @date: 2024/1/29 0029 9:26
 */
public class FileUtil extends cn.hutool.core.io.FileUtil {
  private static final Logger log = LoggerFactory.getLogger(FileUtil.class);
  public static final String SYS_TEM_DIR = System.getProperty("java.io.tmpdir") + File.separator;

  /**
   * 下载excel
   *
   * @param list
   * @param response
   */
  public static void downloadExcel(
      ArrayList<Map<String, Object>> list, HttpServletResponse response) throws IOException {
    // poi.excel 的实现
    String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx";
    File file = new File(tempPath);
    BigExcelWriter writer = ExcelUtil.getBigWriter(file);
    // 一次性写出内容，使用默认样式，强制输出标题
    writer.write(list, true);
    // 上面需要强转SXSSFSheet  不然没有trackAllColumnsForAutoSizing方法
    SXSSFSheet sheet = (SXSSFSheet) writer.getSheet();
    sheet.trackAllColumnsForAutoSizing();
    // 列宽自适应
    writer.autoSizeColumnAll();
    // response为HttpServletResponse对象
    response.setContentType(
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
    // test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
    response.setHeader("Content-Disposition", "attachment;filename=file.xlsx");
    ServletOutputStream outputStream = response.getOutputStream();
    // 终止后删除临时文件
    file.deleteOnExit();
    writer.flush(outputStream, true);
    // 此处记得关闭输出Servlet流
    IoUtil.close(outputStream);
  }
  public static  void  downloadEasyExcel(HttpServletResponse response,ArrayList<Object> arrayList){

  }
  /**
   * 将列表数据导出到Excel文件
   *
   * @param response  HTTP响应对象，用于设置响应头和输出流
   * @param dataList   要导出的数据列表
   * @param excelClazz     数据列表的类类型，用于EasyExcel反射生成表格
   */
  public static void exportToExcel(HttpServletResponse response, ArrayList<?> dataList, Class<?> excelClazz) {
      try {
          // 设置响应类型为Excel文件
          response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
          // 设置响应字符集为UTF-8
          response.setCharacterEncoding(StandardCharsets.UTF_8.name());

          // 编码文件名，以支持中文文件名
          String fileName = URLEncoder.encode("部门列表", StandardCharsets.UTF_8.name());
          // 设置响应头，控制浏览器下载文件而不是打开
          response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");


          // 使用 try-with-resources 确保流正确关闭
          try (OutputStream outputStream = response.getOutputStream()) {
              // 使用EasyExcel库，将数据列表写入到输出流中
              EasyExcel.write(outputStream, excelClazz)
                      .sheet("列表1")
                      .doWrite(dataList);
          }
      } catch (UnsupportedEncodingException e) {
          // 处理编码异常
          System.err.println("编码错误: " + e.getMessage());
      } catch (IOException e) {
          // 处理IO异常
          System.err.println("IO错误: " + e.getMessage());
      }
  }

}
